package com.dynamo.transport.network.practise.channel;

/**
 * @author duanyimiao
 * @create 2018-11-17 9:40 AM
 * @description ChannelHandler容器
 **/
public interface ChannelPipeline {

    /**
     * 在前面追加一个handler
     *
     * @param handler
     * @param name    handler名字
     */
    void addFirst(String name, ChannelHandler handler);

    /**
     * 在最后追加一个handler
     *
     * @param handler
     * @param name    handler名字
     */
    void addLast(String name, ChannelHandler handler);

    void addBefore(String oldName, String newName, ChannelHandler newHandler);

    void addBefore(ChannelHandler oldHandler, String newName, ChannelHandler newHandler);

    void addAfter(String oldName, String newName, ChannelHandler newHandler);

    void addAfter(ChannelHandler oldHandler, String newName, ChannelHandler newHandler);

    /**
     * 根据handler name移除ChannelHandler
     *
     * @param name
     * @return 移除的这个handler
     */
    ChannelHandler remove(String name);

    void remove(ChannelHandler handler);

    /**
     * 根据 handler name替换成新handler
     *
     * @param oldName
     * @param newName
     * @param newHandler
     */
    void replace(String oldName, String newName, ChannelHandler newHandler);

    /**
     * 根据handler 替换成新handler
     *
     * @param oldHandler
     * @param newName
     * @param newHandler
     */
    void replace(ChannelHandler oldHandler, String newName, ChannelHandler newHandler);

    /**
     * 给首个下行handler下发事件
     *
     * @param e
     */
    void sendDownstream(ChannelEvent e);

    /**
     * 给首个上行handler下发事件
     *
     * @param e
     */
    void sendUpstream(ChannelEvent e);

    ChannelSink getSink();

    Channel getChannel();

    void attach(Channel channel, ChannelSink sink);
}
